package com.woniuxy.service;


import com.woniuxy.util.BaiduOcrUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * OCR业务逻辑层：处理文件校验和调用工具类
 */
@Service
@RequiredArgsConstructor // 自动注入构造函数
public class OcrService {
    private final BaiduOcrUtils baiduOcrUtils;

    /**
     * 从图片文件中提取文字
     * @param file 前端上传的图片文件
     * @return 识别结果字符串
     * @throws Exception 处理过程中的异常（文件错误/OCR失败）
     */
    public String extractTextFromImage(MultipartFile file) throws Exception {
        // 1. 基础验证
        if (file.isEmpty()) {
            throw new IOException("上传的文件为空");
        }

        // 2. 验证文件类型
        String contentType = file.getContentType();
        if (contentType == null || !contentType.startsWith("image/")) {
            throw new IOException("不支持的文件类型");
        }

        // 3. 验证具体图片格式
        byte[] fileBytes = file.getBytes();
        if (!isValidImageFormat(fileBytes)) {
            throw new IOException("不支持的图片格式或文件已损坏");
        }

        // 4. 大小限制
        if (file.getSize() > 10 * 1024 * 1024) {
            throw new IOException("文件大小超过10MB限制");
        }

        // 5. 调用OCR识别
        return baiduOcrUtils.recognizeText(fileBytes);
    }

    // 验证图片格式的辅助方法
    private boolean isValidImageFormat(byte[] imageBytes) {
        try {
            // 检查常见图片格式的文件头
            if (imageBytes.length >= 8) {
                // PNG检查
                if (imageBytes[0] == (byte) 0x89 && "PNG".equals(new String(imageBytes, 1, 3))) {
                    return true;
                }
                // JPEG检查
                if (imageBytes[0] == (byte) 0xFF && imageBytes[1] == (byte) 0xD8) {
                    return true;
                }
                // BMP检查
                if ("BM".equals(new String(imageBytes, 0, 2))) {
                    return true;
                }
            }
            return false;
        } catch (Exception e) {
            return false;
        }
    }
}